package com.aisino.api.model;

import lombok.Data;
import java.math.BigDecimal;
import java.util.List;

@Data
public class DrugOutRequest {
    private String appId;
    private String timestamp;
    private String reqId;
    private String uscc;
    private String data;
    private List<DrugOutData> itemList;
    private String sign;

    @Data
    public static class DrugOutData {
        private String ypwybsm;     // 药品唯一标识码
        private String yppzwh;     // 药品唯一标识码
        private Integer crklx;       // 出库类型: 6销售出库 7损耗出库 8召回出库
        private String crksj;       // 出库时间 yyyy-MM-dd HH:mm:ss
        private String jbr;         // 经办人姓名
        private String scrq;        // 生产日期 yyyy-MM-dd
        private String cpph;        // 产品批号
        private String yxqz;        // 有效期至 yyyy-MM-dd
        private Double sl;
        private Double dj;
        private Double xsdj;
        private String ypzsm;       // 药品追溯码，多个用英文逗号隔开
        private String gmryzjlx;    // 购买人员证件类型
        private String gmryzjhm;    // 购买人员证件号码
        private String gmryxm;      // 购买人员姓名
        private Integer xsqd;       // 销售渠道: 1线下 2线上
        private String xsxspt;      // 线上销售平台名称
        private String bz;          // 备注

        /**
         * 验证药品入库数据项是否合法
         * @return 验证结果，null表示验证通过，否则返回错误信息
         */
        public DrugOutRequest.ValidationResult validate(int i) {
            if (ypwybsm == null || ypwybsm.trim().isEmpty()) {
                return new DrugOutRequest.ValidationResult(ResultCode.PARAM_ERROR.getCode(), "第"+i+"条数据药品唯一标识码不能为空");
            }
            if (yppzwh == null || yppzwh.trim().isEmpty()) {
                return new DrugOutRequest.ValidationResult(ResultCode.PARAM_ERROR.getCode(), "第"+i+"条数据yppzwh不能为空");
            }

            if (crklx == null || crklx < 10 || crklx > 19) {
                return new ValidationResult(ResultCode.PARAM_ERROR.getCode(), "第" + (i + 1) + "条数据的crklx不合法，应为10零售出库\n" +
                        "11损耗出库\n" +
                        "12召回出库\n" +
                        "13调拨出库\n" +
                        "14配送退货\n" +
                        "19其它出库");
            }

            if (crksj == null || crksj.trim().isEmpty()) {
                return new DrugOutRequest.ValidationResult(ResultCode.PARAM_ERROR.getCode(), "第"+i+"条数据出库时间不能为空");
            }

            // 验证入库时间格式是否为 yyyy-MM-dd HH:mm:ss
            if (!crksj.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}")) {
                return new DrugOutRequest.ValidationResult(ResultCode.PARAM_ERROR.getCode(), "第"+i+"条数据出库时间格式不正确，应为yyyy-MM-dd HH:mm:ss");
            }

//            if (jbr == null || jbr.trim().isEmpty()) {
//                return new DrugOutRequest.ValidationResult(ResultCode.PARAM_ERROR.getCode(), "第"+i+"条数据经办人姓名不能为空");
//            }

            if (scrq == null || scrq.trim().isEmpty()) {
                return new DrugOutRequest.ValidationResult(ResultCode.PARAM_ERROR.getCode(), "第"+i+"条数据生产日期不能为空");
            }

            // 验证生产日期格式是否为 yyyy-MM-dd
            if (!scrq.matches("\\d{4}-\\d{2}-\\d{2}")) {
                return new DrugOutRequest.ValidationResult(ResultCode.PARAM_ERROR.getCode(), "第"+i+"条数据生产日期格式不正确，应为yyyy-MM-dd");
            }

            if (cpph == null || cpph.trim().isEmpty()) {
                return new DrugOutRequest.ValidationResult(ResultCode.PARAM_ERROR.getCode(), "第"+i+"条数据产品批号不能为空");
            }
            if(cpph.length()>30){
                return new DrugOutRequest.ValidationResult(ResultCode.PARAM_ERROR.getCode(), "第"+i+"条数据产品批号长度不能超过30");
            }
            if (yxqz == null || yxqz.trim().isEmpty()) {
                return new DrugOutRequest.ValidationResult(ResultCode.PARAM_ERROR.getCode(), "第"+i+"条数据有效期至不能为空");
            }

            // 验证有效期至格式是否为 yyyy-MM-dd
            if (!yxqz.matches("\\d{4}-\\d{2}-\\d{2}")) {
                return new DrugOutRequest.ValidationResult(ResultCode.PARAM_ERROR.getCode(), "第"+i+"条数据有效期至格式不正确，应为yyyy-MM-dd");
            }


            if (sl == null || sl <= 0) {
                return new DrugOutRequest.ValidationResult(ResultCode.PARAM_ERROR.getCode(), "第"+i+"条数据药品数量必须大于0");
            }

            // 验证药品数量不能大于千万(10,000,000)
            if (sl > 10000000) {
                return new DrugOutRequest.ValidationResult(ResultCode.PARAM_ERROR.getCode(), "第"+i+"条数据药品数量不能大于千万");
            }

            if (dj == null) {
                dj = 0.00;
            }

            if (xsdj == null) {
                xsdj = 0.00;
            }

            if (xsqd == null) {
                return new DrugOutRequest.ValidationResult(ResultCode.PARAM_ERROR.getCode(), "第"+i+"条销售渠道不能为空");
            } else {
                if (xsqd == 2 && (xsxspt == null || xsxspt.trim().isEmpty())) {
                    return new DrugOutRequest.ValidationResult(ResultCode.PARAM_ERROR.getCode(), "第"+i+"条线上销售平台不能为空");
                }
            }

//            if (ypzsm == null || ypzsm.trim().isEmpty()) {
//                return new ValidationResult(ResultCode.PARAM_ERROR.getCode(), "药品追溯码不能为空");
//            }

            return null; // 验证通过
        }
    }
    
    /**
     * 验证结果内部类
     */
    @Data
    public static class ValidationResult {
        private int code;
        private String message;
        
        public ValidationResult(int code, String message) {
            this.code = code;
            this.message = message;
        }
    }
    
    /**
     * 验证请求参数
     * @return 验证结果，如果为null表示验证通过
     */
    public ValidationResult validate() {
        if (uscc == null || uscc.isEmpty()) {
            return new ValidationResult(ResultCode.PARAM_ERROR.getCode(), "uscc不能为空");
        }
        
        if (itemList == null || itemList.isEmpty()) {
            return new ValidationResult(ResultCode.PARAM_ERROR.getCode(), "data不能为空");
        }
        
        if (itemList.size() > 500) {
            return new ValidationResult(ResultCode.PARAM_ERROR.getCode(), "单次上传数据条数不能超过500条");
        }
        return null;
    }
}